//
//  ViewController.m
//  LLDBDemo
//
//  Created by czera on 2020/4/25.
//  Copyright © 2020 czera. All rights reserved.
//

#import "ViewController.h"
#import "Person.h"

@interface ViewController ()

@property (nonatomic,strong) NSMutableArray <Person*>*models;

@end

@implementation ViewController

- (NSMutableArray<Person *> *)models{
    if (!_models) {
        _models = [NSMutableArray array];
    }
    return _models;
}

void test1(){
    NSLog(@"test1: %d",3);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    Person *p1 = [[Person alloc] init];
    p1.name = @"p1";
    p1.age = 11;
    
    Person *p2 = [[Person alloc] init];
    p2.name = @"p2";
    p2.age = 12;
    
    Person *p3 = [[Person alloc] init];
    p3.name = @"p3";
    p3.age = 13;
    
    [self.models addObject:p1];
    [self.models addObject:p2];
    [self.models addObject:p3];
}


- (IBAction)save:(id)sender {
    NSLog(@"保存！");
}
- (IBAction)pauseGame:(id)sender {
    NSLog(@"暂停！");
}

- (IBAction)continueGame:(id)sender {
    NSLog(@"继续！");
}

-(void)czTest1Str:(NSString *)str{
    [self czTest2Str:str];
}

-(void)czTest2Str:(NSString *)str{
    [self czTest3Str:str];
}

-(void)czTest3Str:(NSString *)str{
    NSLog(@"czTest3 :: %@",str);
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [self czTest1Str:@"czstr"];
    
    Person *p1 = self.models.firstObject;
    p1.name = @"hello";
    
//    NSLog(@"%@",self.models);
    
//    NSLog(@"touchesBegan func");
//    NSLog(@"1");
//    NSLog(@"2");
    test1();
}

/* 断点设置
1.键盘下断点 command + \
2.使用 breakpoint set -n test1 下断点
3.当项目跑起来，单机暂停按钮进入LLDB
4.使用LLDB下载多个断点，【类名 函数名】
breakpoint set -n "[ViewController save:]" -n "[ViewController pauseGame:]" -n "[ViewController continueGame:]"
5.使用 breakpoint list 查看所有断点
6.设置完断点使用 c ，继续运行
7.使某个断点失效 breakpoint disable 1 , 启用 breakpoint enable 1
注意：breakpoint disable 1 会使当前的这一组断点全部失效，使用breakpoint disable 1.1 使某一个断点失效
8.断点是以组的方式存在的
9.删除断点，breakpoint delete 1.1 和 breakpoint delete 1的区别
注意：delete 1.1 是使某个断点失效，而delete 1 是删除第一组的数据。删除只能删除指定的组
10.help breakpoint 查看帮助命令
11.breakpoint set --select touchesBegan:withEvent:
12.breakpoint delete 清空所有断点
13.给某一个文件中的某一方法设置断点
breakpoint set --file ViewController.m -select touchesBegan:withEvent:

14.breakpoint set -r Game: // 遍历文件/系统中含有Game的函数设置断点
注意：LLDB命令大小写严格区分
15.命令缩写 参照官方文档
*/

/* LLDB执行代码 这些代码执行在内存中
1.expression 通过 p、po 和 expression含义是一样的
2.创建自定义对象Person类,实例化对象
3.给数组添加一个Person的对像，并赋值
4.LLDB的强大之处
 4.1 mac 快捷键 option+回车，在面板中写代码
    p Person *p4 = [[Person alloc] init];
    p4.name = @"p4";
    p4.age = 14;
    [self.models addObject:p4]
*/

/* LLDB 查看堆栈信息
1. bt 查看堆栈信息
2. 通过 up 、down 函数使调用堆栈走向上一个函数或着走到下一个函数
3. 通过frame跳转到指定的堆栈
   frame select 3
4. 使用 frame variable 查看参数
5. frame 修改参数
   frame select 1
   frame variable
   p str = @"123"
   frame variable
 这里要注意：我们当前的代码已经执行到 czTest3Str函数中，所以这里输出(NSLog)的依然是之前的参数
 
6. 回滚指令
 thread return
 注意：1.回滚之后函数不会再往下执行
      2.函数直接返回，不会再执行断点之后的代码
      up：不会改变其执行的流程
7. c 程序继续执行
8. n 单步往下走
9. s 遇到函数走进去
10. si ni 注意：s、n是代码级别 si、ni是汇编级别
11. si、ni 可以使用 control + 鼠标点击指令按钮查看
*/

/* LLDB 内存断点
1. touchesBegan 添加代码
    Person *p1 = self.models.firstObject;
    p1.name = @"hello";
2. 再将数据添加到模型的时候设置断点，当p1赋值完成后
 watchpoint set variable p1->_name
3. 断点执行下一步，查看(查看所有内存断点 watchpoint list)内存断点
*/

/* LLDB 其它指令
1.添加3个断点，当程序走到断点时，我们执行一些其它的命令
2.breakpoint 执行command命令
 breakpoint command add 2(表示第几组)
 Enter your debugger command(s).  Type 'DONE' to end.
 > po self
 > p self.view.subViews
 > DONE
 
 // 也可以添加、执行删除命令
 breakpoint command delete 2
*/


/* LLDB target stop-hook
1. target stop-hook add -o "frame variable"
 含义：不管你断住了哪一个方法，我都会把这个方法的参数打印出来 -o 表示添加一条指令
2. target stop-hook delete
3. target stop-hook list
*/

/*
1. .lldbinit 文件使用，在文件中添加 target stop-hook add -o "frame variable"命令
2. 使用 cat .lldbinit
3. 执行代码，会发现只要有断点的地方就会输出参数
*/

/* 关于 image和其它常用指令
1. image list
   查看工程中使用的库(包括MachO自己)
 
2. image lookup --address 0x0000000100000de0
   查找可执行文件或共享库的原始地址
 
3. image lookup --type NSURL
   输出NSURL的成员变量及属性信息。

4. image dump symtab
   导出可执行文件和共享库的所有符号表
*/


@end
